package utils;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.List;

//工具类，用于上传文件
public class FileUploadUtil {
    private static final String FILE_PATH = "E:/Files";

    public static void uploadFile(HttpServletRequest request){
        //获得磁盘文件条目工厂
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //设置暂存，避免占用过多内存
        factory.setRepository(new File(FILE_PATH));
        //设置 缓存的大小，当上传文件的容量超过该缓存时，直接放到 暂时存储室
        factory.setSizeThreshold(1024*1024*10) ;
        //高水平的API文件上传处理
        ServletFileUpload upload = new ServletFileUpload(factory);
        //解决上传文件名的中文乱码
        upload.setHeaderEncoding("UTF-8");

        if(!ServletFileUpload.isMultipartContent(request)) {
            //按传统方式获取数据
            return;
        }
        List<FileItem> list = null;
        try {
            list = (List<FileItem>) upload.parseRequest(request); //上传文件列表
            Long size = null; //上传文件大小
            String url = "";    //上传文件链接

            for(FileItem item: list){

                //如果获取的表单信息是普通的文本信息
                if(item.isFormField()) {
                    //获取表单的属性名字
                    String name = item.getFieldName();
                    //获取用户具体输入的字符串，表单提交过来的是字符串类型的
                    String value = item.getString("UTF-8") ;
//                    byte[] values=value.getBytes(StandardCharsets.ISO_8859_1);
//                    String newValue=new String(values, StandardCharsets.UTF_8);//处理中文乱码问题
                    //设置请求属性
                    request.setAttribute(name,value);
                    System.out.println(name + "=" + value);
                }
                //对传入的非简单的字符串进行处理 ，比如说二进制的图片
                else {
                    //获取表单的属性名字
                    String name = item.getFieldName();
                    //获取路径名
                    String value = item.getName() ;
                    //索引到最后一个反斜杠
                    int start = value.lastIndexOf("\\");
                    //截取上传文件的字符串名字，加1是去掉反斜杠，
                    String filename = value.substring(start+1);
                    //设置请求属性
                    request.setAttribute(name, filename);
                    //真正写到磁盘上
                    System.out.println(filename);
                    OutputStream out = new FileOutputStream(new File(FILE_PATH,filename));
                    InputStream in = item.getInputStream() ;
                    int length = 0 ;
                    byte [] buf = new byte[1024];

                    //封装返回数据
                    url = "http://localhost:8080/files/"+filename;
                    size = item.getSize();
                    request.setAttribute("file_url", url);
                    request.setAttribute("size", size+"k");

                    //将buf数组中取出数据写到（输出流）磁盘上
                    while( (length = in.read(buf) ) != -1) {
                        out.write(buf, 0, length);
                    }

                    //关闭输入输出流
                    in.close();
                    out.close();
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
